"""
@Author：十
@Time：2024/9/27 17:06
@FileName：item.py
@Description： 界面中各个设备数据项的UI
"""

from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QPalette, QColor
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel

from edit import DCR_EditWindow, LR_EditWindow, EC_EditWindow


# 直流电阻测试仪
class DCR_Widget(QWidget):
    # 选择信号，传递到主函数改变“数据管理”按钮的使能+获取被选中的数据。每次鼠标点击时触发
    selection_changed = pyqtSignal(bool)
    # 编辑按钮信号
    Signal_Edit = pyqtSignal(object)

    def __init__(self, data, row_id=None, parent=None, remove_callback=None):
        super().__init__(parent)

        self.parent = parent

        self.row_id = row_id  # 行ID，用于标识数据项
        self.data = data  # 存储该组件的数据
        self.remove_callback = remove_callback  # 回调函数用于移除该组件

        # 编辑页面
        self.EditWindow = DCR_EditWindow(self)
        # 编辑返回
        self.Signal_Edit.connect(self.UpdateData)

        # 点击选择标志
        self.selected = False

        # 设置背景颜色
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor('lightgray'))
        self.setPalette(palette)

        # self.setStyleSheet("background-color: lightgray;")

        # self.ChangeBackgroundColor()

        # 垂直布局用于展示数据字段
        layout = QVBoxLayout()
        # 保存label对象
        self.labels = []

        # 设置数据的标题和对应的值
        headers = ["测试时间：", "测试电流：（mA）", "测试方式：", "AO电阻（mΩ）：", "BO电阻（mΩ）：", "CO电阻（mΩ）：", "最大不平衡率（%）："]
        values = [data['test_time'], data['test_electricity'], data['test_mode'], data['resistor_ao'],
                  data['resistor_bo'], data['resistor_co'], data['max_unbalance_rate']]

        # 将每一个标题和值用 QLabel 显示出来，并添加到布局中
        for header, value in zip(headers, values):
            label = QLabel(f"{header}: {value}")
            layout.addWidget(label)
            self.labels.append(label)

        # 添加一个“编辑”按钮，并设置其样式和位置
        self.edit_label = QLabel("编辑")
        self.edit_label.setStyleSheet("color: black;")
        self.edit_label.setAlignment(Qt.AlignRight)

        # 安装事件过滤器，监听鼠标事件
        self.edit_label.installEventFilter(self)
        layout.addWidget(self.edit_label)

        self.setLayout(layout)  # 将布局设置给当前窗口

    # "编辑"label点击事件
    def eventFilter(self, obj, event):
        if obj == self.edit_label:
            if event.type() == event.Enter:
                self.edit_label.setStyleSheet("color: red;")
            elif event.type() == event.Leave:
                self.edit_label.setStyleSheet("color: black;")
            elif event.type() == event.MouseButtonPress:
                self.EditWindow.show()
                self.EditWindow.Signal_Get_Date.emit(self.data)
            # self.save_to_database()
        return super().eventFilter(obj, event)

    # 点击选中事件
    def mousePressEvent(self, event):
        self.selected = not self.selected
        ChangeBackgroundColor(self)
        self.selection_changed.emit(self.selected)

    # 获取选中的数据列表
    # 鼠标点击一个数据时，将其加入到list中，取消选中时移出list
    # 每一次鼠标点击都传递一次  OR 点击“数据管理”时遍历所有按钮看哪些是select为true
    def GetDataList(self):
        # 每一次鼠标点击都传递一次，list就要写到widget外面
        select_data = []
        if self.selected:
            select_data.append(self.data)

    # 编辑数据
    def UpdateData(self, data):
        try:
            # 都改
            # headers = ["测试时间：", "测试电流：", "测试方式：", "AO电阻：", "BO电阻：", "CO电阻：", "最大不平衡率："]
            # values = [data['test_time'], data['test_electricity'], data['test_mode'], data['resistor_ao'],
            #           data['resistor_bo'], data['resistor_co'], data['max_unbalance_rate']]
            # for i, value in enumerate(values):  # 假设 new_values 是新的数据列表
            #     self.labels[i].setText(f"{headers[i]}: {values[i]}")

            # 只改这几个
            headers = ["测试电流：", "测试方式：", "AO电阻：", "BO电阻：", "CO电阻："]
            values = [data['test_mode'], data['test_electricity'], data['resistor_ao'],
                      data['resistor_bo'], data['resistor_co']]
            j = 0
            for i, label in enumerate(self.labels):
                # 检查是否是第一个或最后一个元素
                if i != 0 and i != len(self.labels) - 1:
                    label.setText(f"{headers[j]}: {values[j]}")
                    j += 1
        except Exception as e:
            print('修改数据错误：', e)


# 回路电阻测试仪
class LR_Widget(QWidget):
    # 选择信号，传递到主函数改变“数据管理”按钮的使能+获取被选中的数据。每次鼠标点击时触发
    selection_changed = pyqtSignal(bool)
    # 编辑按钮信号
    Signal_Edit = pyqtSignal(object)

    def __init__(self, data, row_id=None, parent=None, remove_callback=None):
        super().__init__(parent)

        self.parent = parent

        self.row_id = row_id  # 行ID，用于标识数据项
        self.data = data  # 存储该组件的数据
        self.remove_callback = remove_callback  # 回调函数用于移除该组件

        # 编辑页面
        self.EditWindow = LR_EditWindow(self)
        # 编辑返回
        self.Signal_Edit.connect(self.UpdateData)

        # 点击选择标志
        self.selected = False

        # 设置背景颜色
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor('lightgray'))
        self.setPalette(palette)

        # 垂直布局用于展示数据字段
        layout = QVBoxLayout()
        # 保存label对象
        self.labels = []

        # 设置数据的标题和对应的值
        headers = ["测试时间：", "实测电阻（mΩ）：", "实测电压（mV）：", "实测电流（mA）："]
        values = [data['test_time'], data['resistor'], data['voltage'], data['current']]

        # 将每一个标题和值用 QLabel 显示出来，并添加到布局中
        for header, value in zip(headers, values):
            label = QLabel(f"{header}: {value}")
            layout.addWidget(label)
            self.labels.append(label)

        # 添加一个“编辑”按钮，并设置其样式和位置
        self.edit_label = QLabel("编辑")
        self.edit_label.setStyleSheet("color: black;")
        self.edit_label.setAlignment(Qt.AlignRight)

        # 安装事件过滤器，监听鼠标事件
        self.edit_label.installEventFilter(self)
        layout.addWidget(self.edit_label)

        self.setLayout(layout)  # 将布局设置给当前窗口

    # "编辑"label点击事件
    def eventFilter(self, obj, event):
        if obj == self.edit_label:
            if event.type() == event.Enter:
                self.edit_label.setStyleSheet("color: red;")
            elif event.type() == event.Leave:
                self.edit_label.setStyleSheet("color: black;")
            elif event.type() == event.MouseButtonPress:
                self.EditWindow.show()
                self.EditWindow.Signal_Get_Date.emit(self.data)
            # self.save_to_database()
        return super().eventFilter(obj, event)

    # 点击选中事件
    def mousePressEvent(self, event):
        try:
            self.selected = not self.selected
            ChangeBackgroundColor(self)
            self.selection_changed.emit(self.selected)
        except Exception as e:
            print('item clicked error:', e)

    # 获取选中的数据列表
    # 鼠标点击一个数据时，将其加入到list中，取消选中时移出list
    # 每一次鼠标点击都传递一次  OR 点击“数据管理”时遍历所有按钮看哪些是select为true
    def GetDataList(self):
        # 每一次鼠标点击都传递一次，list就要写到widget外面
        select_data = []
        if self.selected:
            select_data.append(self.data)

    # 编辑数据
    def UpdateData(self, data):
        try:
            # print(data)
            # 只改这几个
            headers = ["实测电流(mA)：", "实测电阻(mΩ)：", "实测电压(mV)："]
            values = [data['current'], data['resistor'], data['voltage']]
            j = 0
            for i, label in enumerate(self.labels):
                # 检查是否是第一个或最后一个元素
                if i != 0 and i != len(self.labels):
                    label.setText(f"{headers[j]}: {values[j]}")
                    j += 1
        except Exception as e:
            print('修改数据错误：', e)


# 选中时改变背景颜色
def ChangeBackgroundColor(widget):
    try:
        widget.setAutoFillBackground(True)
        palette = widget.palette()
        if widget.selected:
            palette.setColor(QPalette.Window, QColor('#b6c9b8'))  # 屎绿色
            # print(widget.data)
        else:
            palette.setColor(QPalette.Window, QColor('lightgray'))  # 浅灰色
        widget.setPalette(palette)
        widget.update()
    except Exception as e:
        print('改变背景颜色失败：', e)


# 接地导通仪
class EarthContinuity_Widget(QWidget):
    # 选择信号，传递到主函数改变“数据管理”按钮的使能+获取被选中的数据。每次鼠标点击时触发
    selection_changed = pyqtSignal(bool)
    # 编辑按钮信号
    Signal_Edit = pyqtSignal(object)

    def __init__(self, data, row_id=None, parent=None, remove_callback=None):
        super().__init__(parent)

        self.parent = parent

        self.row_id = row_id  # 行ID，用于标识数据项
        self.data = data  # 存储该组件的数据
        self.remove_callback = remove_callback  # 回调函数用于移除该组件

        # 编辑页面
        self.EditWindow = EC_EditWindow(self)
        # 编辑返回
        self.Signal_Edit.connect(self.UpdateData)

        # 点击选择标志
        self.selected = False

        # 设置背景颜色
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor('lightgray'))
        self.setPalette(palette)

        # 垂直布局用于展示数据字段
        layout = QVBoxLayout()
        # 保存label对象
        self.labels = []

        # 设置数据的标题和对应的值
        headers = ["测试时间：", "测试电流：（A）", "测试电阻（Ω）："]
        values = [data['test_time'], data['current'], data['resistor']]

        # 将每一个标题和值用 QLabel 显示出来，并添加到布局中
        for header, value in zip(headers, values):
            label = QLabel(f"{header}: {value}")
            layout.addWidget(label)
            self.labels.append(label)

        # 添加一个“编辑”按钮，并设置其样式和位置
        self.edit_label = QLabel("编辑")
        self.edit_label.setStyleSheet("color: black;")
        self.edit_label.setAlignment(Qt.AlignRight)

        # 安装事件过滤器，监听鼠标事件
        self.edit_label.installEventFilter(self)
        layout.addWidget(self.edit_label)

        self.setLayout(layout)

    # "编辑"label点击事件
    def eventFilter(self, obj, event):
        if obj == self.edit_label:
            if event.type() == event.Enter:
                self.edit_label.setStyleSheet("color: red;")
            elif event.type() == event.Leave:
                self.edit_label.setStyleSheet("color: black;")
            elif event.type() == event.MouseButtonPress:
                self.EditWindow.show()
                self.EditWindow.Signal_Get_Date.emit(self.data)
        return super().eventFilter(obj, event)

    # 点击选中事件
    def mousePressEvent(self, event):
        self.selected = not self.selected
        ChangeBackgroundColor(self)
        self.selection_changed.emit(self.selected)

    # 获取选中的数据列表
    # 鼠标点击一个数据时，将其加入到list中，取消选中时移出list
    # 每一次鼠标点击都传递一次  OR 点击“数据管理”时遍历所有按钮看哪些是select为true
    def GetDataList(self):
        # 每一次鼠标点击都传递一次，list就要写到widget外面
        select_data = []
        if self.selected:
            select_data.append(self.data)

    # 编辑数据
    def UpdateData(self, data):
        try:
            headers = ["测试电流：（A）", "测试电阻（Ω）："]
            values = [data['current'], data['resistor']]
            j = 0
            for i, label in enumerate(self.labels):
                if i != 0 and i != len(self.labels):
                    label.setText(f"{headers[j]}: {values[j]}")
                    j += 1
        except Exception as e:
            print('修改数据错误：', e)


# "编辑"label点击事件
def eventFilter(self, obj, event):
    if obj == self.edit_label:
        if event.type() == event.Enter:
            self.edit_label.setStyleSheet("color: red;")
        elif event.type() == event.Leave:
            self.edit_label.setStyleSheet("color: black;")
        elif event.type() == event.MouseButtonPress:
            self.EditWindow.show()
            self.EditWindow.Signal_Get_Date.emit(self.data)
        # self.save_to_database()
    return super().eventFilter(obj, event)
